package com.ys.p6TreeSet的了解;

import java.util.Comparator;
import java.util.Iterator;
import java.util.TreeSet;

/**
 * 描述:
 *  1.TreeSet的概述
 *  *   TreeSet底层维护着一个NavigableMap集合，也就是维护着一个TreeMap集合，这也就意味着TreeSet底层使用“红黑树”来实现。
 *  *   分析add(E e)方法源码
 *  *       public boolean add(E e) {
 *  *            return m.put(e, PRESENT)==null;
 *  *       }
 *  *   从而我们知道，TreeSet存储的元素其本质就是Map集合中的key，而Map集合中的value全部都是static修饰的Object对象。
 *  *   说明：TreeMap是NavigableMap接口的实现类
 *  * 2.TreeSet的构造方法
 *  *   public TreeSet()  --> 创建一个TreeSet集合，默认使用的是内部比较器（Comparable）
 *  *   public TreeSet(Comparator<? super E> comparator) --> 创建一个TreeSet集合，指定使用的是外部比较器（Comparable）
 *  * 3.TreeSet的注意点
 *  *   如果采用“无参构造方法”来创建TreeSet集合，那么存储元素对应的类必须实现Comparable接口，并且重写compareTo()方法
 *  *   如果采用“有参构造方法”来创建TreeSet集合，那么必须在Comparator接口的
 *
 * @author CodeYang
 * @version 2020/12/28 21:23
 */
public class TreeSet了解与使用 {

    public static void main(String[] args) {

        /**
         * TreeSet 的底层就是一个 TreeMap
         * 它维护着:  private transient NavigableMap<E,Object> m;
         * NavigableMap<E,Object> 就是红黑树的接口 TreeMap 是 NavigableMap的实现类 可以使用多态
         *  注意: key不能重复,且不可以存null 因为有比较器的转换 null.compare 会报错
         * 1: key 的Java默认类 不需要重写比较器.
         * 2: TreeSet()无参 key 自定义类 - 要实现内部比较器
         * 3: TreeSet()有参 的外部比较器
         *   value 还是一个默认值
         *   public boolean add(E e) {
         *         return m.put(e, PRESENT)==null;
         *     }
         *
         */

        TreeSet<Student> treeSet = new TreeSet<Student>(new Comparator<Student>() {
            /**
             * 根据年龄升序排序
             * @param o1
             * @param o2
             * @return
             */
            @Override
            public int compare(Student o1, Student o2) {
                return o1.getAge() - o2.getAge();
            }
        });
        treeSet.add(new Student("1",20));
        treeSet.add(new Student("2",70));
        treeSet.add(new Student("3",60));
        treeSet.add(new Student("4",80));

        Iterator<Student> iterator = treeSet.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        /**
         * Student{name='1', age=20}
         * Student{name='3', age=60}
         * Student{name='2', age=70}
         * Student{name='4', age=80}
         */


    }


}
